using System;
using System.Collections.Generic;
using System.Text;
using NEXServicio;
using System.Data;

namespace NEXEntidad
{
    #region Pais

    public class Pais : NEXEntidad.NEXEntidadElemento
    {
        #region Constructores

        public Pais(int idPais)
            : base(idPais)
        {
            this.IdPais = idPais;
        }
        public Pais(Guid guid, String nombre, String codigo)
            : base()
        {
            this.GUId = guid;
            this.Nombre = nombre;
            this.Codigo = codigo;
        }
        public Pais()
            : base()
        {
        }
        #endregion

        #region Campos/Propiedades

        private int idPais;
        public int IdPais
        {
            get { return idPais; }
            set { idPais = value; }
        }

        private string codigo;
        public string Codigo
        {
            get
            {
                return this.codigo;
            }
            set
            {
                codigo = value;
            }
        }

        private string nombre;
        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        private bool activo;
        public bool Activo
        {
            get { return activo; }
            set { activo = value; }
        }

        #endregion

        #region Metodos de carga

        protected override void Obtener()
        {
            using (DataSet ds = ServicioPais.Obtener(this.IdPais, this.Codigo))
            {
                DataTable dtPais = ds.Tables[ServicioPais.DataTableName];
                if (dtPais.Rows.Count > 0)
                {
                    DataRow drCalle = dtPais.Rows[0];
                    Pais.Cargar(this, drCalle);
                }
                else
                {
                    throw new ObjetoInexistenteException("Pais");
                }
            }
        }

        private static void Cargar(Pais pais, DataRow drPais)
        {
            pais.idPais = Convert.ToInt32(drPais["IdPais"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
            pais.GUId = new Guid(drPais["Guid"].ToString());
            pais.nombre = drPais["Nombre"].ToString();
            pais.codigo = drPais["Codigo"].ToString();
            pais.ObjetoCargado();
        }

        internal static PaisCollection CrearListaCargada(DataRowCollection drcPaises)
        {
            PaisCollection paises = new PaisCollection();
            foreach (DataRow drPais in drcPaises)
            {
                paises.Add(Pais.CrearCargado(drPais));
            }
            return paises;
        }

        private static Pais CrearCargado(DataRow drPais)
        {
            Pais pais = new Pais(Convert.ToInt32(drPais["IdPais"].ToString()));
            Pais.Cargar(pais, drPais);
            return pais;
        }
        #endregion

        #region Metodos publicos

        public override String ToString()
        {
            return this.Nombre;
        }

        public String ToXml()
        {
            return "<Pais IdPais=\"" + this.Id.ToString(System.Globalization.CultureInfo.CurrentCulture) + "\" />";
        }

        public static PaisCollection Listar()
        {
            return Pais.CrearListaCargada(ServicioPais.Listar(true).Tables[ServicioPais.DataTableName].Rows);
        }

        public static ElementoCollection ListarEntidad(String nombrePais)
        {
            ElementoCollection lista = new ElementoCollection();
            PaisCollection listaPaises;
            listaPaises = Pais.CrearListaCargada(ServicioPais.Listar(nombrePais).Tables[ServicioPais.DataTableName].Rows);
            foreach (Pais unPais in listaPaises)
            {
                NEXEntidadElemento elemento;
                elemento = (NEXEntidadElemento)unPais;
                elemento.Descripcion = unPais.ToString();

                lista.Add(elemento);

            }
            return lista;
        }



        public static Pais Nuevo()
        {
            return new Pais();
        }

        public static Pais Nuevo(string nombre)
        {
            return new Pais(Guid.NewGuid(), nombre, "");
        }

        public static Pais ObtenerPorNombre(string nombre)
        {
            using (DataSet ds = ServicioPais.Listar(nombre))
            {
                DataTable dtPais = ds.Tables[ServicioPais.DataTableName];
                if (dtPais.Rows.Count == 1)
                {
                    DataRow drPais = dtPais.Rows[0];
                    return Pais.CrearCargado(drPais);
                }
                else
                {
                    return null;
                }
            }
        }

        #endregion
    }

    #endregion

    #region PaisCollection

    [Serializable]
    public class PaisCollection : NEXCollection<Pais>
    {
    }

    #endregion
}
